package main

import (
	"fmt"
)

/*
*
切片
看到:238页

注意点:
1)切片初始化时 var slice = arr[startIndex:endIndex]
说明：从 arr 数组下标为 startIndex，取到 下标为 endIndex 的元素(不含 arr[endIndex])。
2)切片初始化时，仍然不能越界。范围在 [0-len(arr)] 之间，但是可以动态增长.

var slice = arr[0:end] 可以简写 var slice = arr[:end]
var slice = arr[start:len(arr)] 可以简写： var slice = arr[start:] var slice = arr[0:len(arr)] 可以简写: var slice = arr[:]
3)cap 是一个内置函数，用于统计切片的容量，即最大可以存放多少个元素。
4)切片定义完后，还不能使用，因为本身是一个空的，需要让其引用到一个数组，或者 make 一个空间供切片来使用
5)切片可以继续切片[案例演示]
*/
func main() {
	fmt.Println("Hello, World!name:")

	fmt.Println("==定义一个切片(方法1)==")
	/* 定义一个数组 */
	var intArr [5]int = [5]int{1, 2, 3, 4, 5}
	/* 声明一个切片
	slice:切片名称
	intArr[1:3]表示从数组的第2个元素开始，到第4个元素结束（不包括索引为3的元素）
	*/
	slice := intArr[1:3]
	fmt.Printf("==intArr:%v==\n", intArr)
	fmt.Printf("==slice:%v==个数%d,容量为:%d\n", slice, len(slice), cap(slice))

	fmt.Println("==定义一个切片(方法2)==")
	var slice2 []int = make([]int, 3)
	slice2[0] = 1
	slice2[1] = 2
	slice2[2] = 3
	fmt.Printf("==slice2:%v==个数%d,容量为:%d\n", slice2, len(slice2), cap(slice2))

	fmt.Println("==定义一个切片(方法3)==")
	slice3 := []int{1, 2, 3}
	fmt.Printf("==slice3:%v==个数%d,容量为:%d\n", slice3, len(slice3), cap(slice3))

	fmt.Println("==切片扩容==")
	// 创建一个初始长度为0，最大容量为5的切片
	slice4 := make([]int, 0, 5)
	// 向切片中添加元素
	for i := 0; i < 10; i++ {
		slice4 = append(slice4, i)
	}
	fmt.Printf("==slice4:%v==个数%d,容量为:%d\n", slice4, len(slice4), cap(slice4))

	/* 把切片当成数组来使用 */
	fmt.Println("==切片当成数组来使用==")
	var arr [5]int = [5]int{1, 2, 3, 4, 5}
	slice5 := arr[1:4]

	fmt.Println("==遍历切片1==")
	for i := 0; i < len(slice5); i++ {
		fmt.Printf("循环切片1:索引:%d,值为:%d\n", i, slice5[i])
	}
	fmt.Println("==遍历切片2==")
	for i, v := range slice5 {
		fmt.Printf("循环切片2:索引:%d,值1为:%d,值2为:%d\n", i, slice5[i], v)
	}

	/* string底层敢是一个数组,也可以当成切片使用 */
	str2 := "123中国人@qq.com"
	/* 抽取第0到第三个,进行切片 */
	slice6 := str2[0:3]
	fmt.Printf("==slice6:%v==个数%d\n", slice6, len(slice6))

	slice7 := []rune(str2)
	fmt.Printf("==slice7:%v==个数%d\n", slice7, len(slice7))
	str3 := string(slice7[0:4])
	fmt.Printf("==str3:%v==个数%d\n", str3, len(str3))
}
